Ethereum の署名済みトランザクションをデコードして内容を確認
Ethereum の署名済みトランザクションをデコードして内容を確認する方法です。
署名済みトランザクションは、RLP という方式でエンコードされています。
署名済みのトランザクションの例
0xf86b808504a817c800825208942890228d4478e2c3b0ebf5a38479e3396c1d6074872386f26fc100008029a0520e5053c1b573d747f823a0b23d52e5a619298f46cd781d677d0e5e78fbc750a075be461137c2c2a5594beff76ecb11a215384c574a7e5b620dba5cc63b0a0f13
このトランザクションは、実際に Ropsten ネットワークに送信されています。
Ethereum の署名済みトランザクションをデコード
rlp という npm ライブラリを使用して、上記の署名済みトランザクションをデコードするプログラム例です。
code:decodeSignedTx.js
const Rlp = require('rlp') // npm install rlp
const signedTx = "0xf86b808504a817c800825208942890228d4478e2c3b0ebf5a38479e3396c1d6074872386f26fc100008029a0520e5053c1b573d747f823a0b23d52e5a619298f46cd781d677d0e5e78fbc750a075be461137c2c2a5594beff76ecb11a215384c574a7e5b620dba5cc63b0a0f13"
const decodedSignedTx = Rlp.decode(signedTx)
console.log(decodedSignedTx)
デコード結果
以下は、上記プログラムで得られる decodedSignedTx の中身は次のようなバイト列の配列です。
code:decodedSignedTx.js
[ <Buffer >,
<Buffer 04 a8 17 c8 00>,
<Buffer 52 08>,
<Buffer 28 90 22 8d 44 78 e2 c3 b0 eb f5 a3 84 79 e3 39 6c 1d 60 74>,
<Buffer 23 86 f2 6f c1 00 00>,
<Buffer >,
<Buffer 29>,
<Buffer 52 0e 50 53 c1 b5 73 d7 47 f8 23 a0 b2 3d 52 e5 a6 19 29 8f 46 cd 78 1d 67 7d 0e 5e 78 fb c7 50>,
<Buffer 75 be 46 11 37 c2 c2 a5 59 4b ef f7 6e cb 11 a2 15 38 4c 57 4a 7e 5b 62 0d ba 5c c6 3b 0a 0f 13> ]
上記バイト列の解釈方法
Ethereum のトランザクションデータは次のような順番で配列になっています。
1. Tn = nonce
2. Tp = gasPrice
3. Tg = gasLimit
4. Tt = to
5. Tv = value
6. Td = data (Tt が 0 のとき、つまりコントラクト作成トランザクションの場合は Ti = init data)
7. Tw = v
8. Tr = r
9. Ts = s
つまり、上記のバイト列は次のように解釈することができます。
code:txData.js
0x => nonce
0x04a817c800 => gasPrice
0x5208 => gasLimit
0x2890228d4478e2c3b0ebf5a38479e3396c1d6074 => to
0x2386f26fc10000 => value
0x => data
0x29 => v
0x520e5053c1b573d747f823a0b23d52e5a619298f46cd781d677d0e5e78fbc750 => r
0x75be461137c2c2a5594beff76ecb11a215384c574a7e5b620dba5cc63b0a0f13 => s
参考
https://gyazo.com/d38b41fe141826ec9b4576dc30acae8f